package cc.rengu.igas.bomp.core.service.trans;

import cc.rengu.igas.bomp.common.constant.BompAppParamConstant;
import cc.rengu.igas.bomp.common.constant.TableNameConstant;
import cc.rengu.igas.bomp.common.dao.BizTmpMapper;
import cc.rengu.igas.bomp.common.dao.MchntBaseInfoMapper;
import cc.rengu.igas.bomp.common.dao.MchntSignInfoMapper;
import cc.rengu.igas.bomp.common.dao.impl.BizTmpMapperImpl;
import cc.rengu.igas.bomp.common.dao.impl.MchntBaseInfoMapperImpl;
import cc.rengu.igas.bomp.common.dao.impl.MchntSignInfoMapperImpl;
import cc.rengu.igas.bomp.common.entity.BizTmp;
import cc.rengu.igas.bomp.common.entity.MchntBaseInfo;
import cc.rengu.igas.bomp.common.entity.MchntSignInfo;
import cc.rengu.igas.bomp.common.enums.AuditStatusEnum;
import cc.rengu.igas.bomp.common.enums.ImageTypeEnum;
import cc.rengu.igas.bomp.common.enums.MchntStatusEnum;
import cc.rengu.igas.bomp.common.enums.RespCodeEnum;
import cc.rengu.igas.bomp.common.util.InitParamUtil;
import cc.rengu.igas.bomp.core.service.base.AuditService;
import cc.rengu.igas.bomp.facade.bean.MchntImageInfoBean;
import cc.rengu.igas.bomp.facade.enums.BompManageOprTypeEnum;
import cc.rengu.igas.bomp.facade.enums.BompMchntStatusEnum;
import cc.rengu.igas.bomp.facade.request.MchntImageInfoManageRequest;
import cc.rengu.igas.bomp.facade.response.MchntImageInfoManageResponse;
import cc.rengu.oltp.service.common.constant.AppConfigConstant;
import cc.rengu.oltp.service.common.constant.AppParamConstant;
import cc.rengu.oltp.service.model.BizException;
import cc.rengu.oltp.service.model.BizResponse;
import cc.rengu.oltp.utility.util.*;
import com.alibaba.fastjson.JSONObject;
import org.springframework.util.CollectionUtils;

import java.util.List;

/**
 * 商户影像信息管理
 */
public class MchntImageInfoManageService extends AuditService {

    @Override
    protected Object bizBeforeCust() throws Exception {
        MchntImageInfoManageRequest request = new MchntImageInfoManageRequest();
        ConvertUtil.convertOutput(request);
        return request;
    }

    @Override
    protected BizResponse bizProcessCust(Object request) throws Exception {
        MchntImageInfoManageRequest mchntImageInfoManageRequest = (MchntImageInfoManageRequest) request;
        BizResponse<MchntImageInfoManageResponse> bizResponse = new BizResponse<>();
        MchntImageInfoManageResponse mchntImageInfoManageResponse = new MchntImageInfoManageResponse();
        MchntBaseInfoMapper mchntBaseInfoMapper = new MchntBaseInfoMapperImpl();
        List<MchntImageInfoBean> mchntImageInfoBeanList = mchntImageInfoManageRequest.getMchntImageInfoBeanList();

        //region 业务前检查
        //查询商户信息
        MchntBaseInfo mchntBaseInfo = mchntBaseInfoMapper.selectMchntBaseInfoByPrimaryKey(mchntImageInfoManageRequest.getHeader().getInstId(), mchntImageInfoManageRequest.getMchntNo());
        if (null == mchntBaseInfo) {
            rglog.error("管理商户影像信息失败, 根据商户号查询商户基本信息为空，instId:{},mchntNo:{}", mchntImageInfoManageRequest.getHeader().getInstId(), mchntImageInfoManageRequest.getMchntNo());
            throw new BizException(RespCodeEnum.MCHNT_INFO_NOT_FOUND.getRespCode(), RespCodeEnum.MCHNT_INFO_NOT_FOUND.getRespDesc());
        }

        if (BompMchntStatusEnum.CANCEL.getType().equals(mchntBaseInfo.getMchntStatus())) {
            rglog.error("管理商户影像信息失败, 根据商户号查询商户状态为已注销，instId:{},mchntNo:{}", mchntBaseInfo.getInstId(), mchntBaseInfo.getMchntNo());
            throw new BizException(RespCodeEnum.MCHNT_CANCEL.getRespCode(), RespCodeEnum.MCHNT_CANCEL.getRespDesc());
        }

        /*20201221-业务需求-影像不必填*/
        // if (CollectionUtils.isEmpty(mchntImageInfoBeanList)) {
        //     rglog.error("管理商户影像信息失败, 影像信息参数为空！，instId:{},mchntNo:{}", mchntBaseInfo.getInstId(), mchntBaseInfo.getMchntNo());
        //     throw new BizException(RespCodeEnum.PARAM_ERROR.getRespCode(), RespCodeEnum.PARAM_ERROR.getRespDesc());
        // }

        if (BompManageOprTypeEnum.AUDIT.getType().equals(mchntImageInfoManageRequest.getOprType())) {
            //审核商户影像信息
            rglog.error("不允许单个页面进行审核操作！instId:{},前端流水号:{}",
                    mchntImageInfoManageRequest.getHeader().getInstId(), mchntImageInfoManageRequest.getHeader().getTraceNo());
            throw new BizException(RespCodeEnum.MSG_VALID_CHECK_ERROR.getRespCode(), RespCodeEnum.MSG_VALID_CHECK_ERROR.getRespDesc());
        }
        //endregion

        /* 开启数据库事务 */
        String dbPoolName = XmlConfigUtil.getXmlConfigCacheKeyValue(AppConfigConstant.DATABASE_CONF_NODE, AppConfigConstant.MCMP_POOL_NAME);
        DbsUtil dbsUtil = new DbsUtil(dbPoolName);
        dbsUtil.dbsBeginTransaction();
        try {
            /*更新商户基本信息*/
            updateMchntAuditStatus(mchntImageInfoManageRequest, mchntBaseInfo);
            rglog.debug("更新商户信息成功.");

            /*保存商户签约协议号*/
            savaMchntSignId(mchntImageInfoManageRequest, mchntBaseInfo);

            /*影像信息入库*/
            if (!CollectionUtils.isEmpty(mchntImageInfoBeanList)) {
                InitParamUtil.manageMchntImage(mchntBaseInfo, mchntImageInfoBeanList, ImageTypeEnum.IMAGE_MANAGE_IMAGE_TYPES);
            }
        } catch (Exception e) {
            dbsUtil.dbsEndTransaction(false);
            throw new BizException(RespCodeEnum.SYSTEM_BUSYNESS.getRespCode(), RespCodeEnum.SYSTEM_BUSYNESS.getRespDesc());
        }

        /*提交事务*/
        dbsUtil.dbsEndTransaction(true);

        mchntImageInfoManageResponse.setRespCode(RespCodeEnum.TRANS_SUCCESS.getRespCode());
        mchntImageInfoManageResponse.setRespDesc(RespCodeEnum.TRANS_SUCCESS.getRespDesc());
        bizResponse.setResult(mchntImageInfoManageResponse);
        bizResponse.setRespCode(RespCodeEnum.TRANS_SUCCESS.getRespCode());
        bizResponse.setRespDesc(RespCodeEnum.TRANS_SUCCESS.getRespDesc());
        bizResponse.setRspSysId(AppParamConstant.SYS_ID);
        return bizResponse;
    }

    @Override
    protected void bizAfterCust(Object response) throws Exception {
        BizResponse bizResponse = (BizResponse) response;
        MchntImageInfoManageResponse mchntImageInfoManageResponse = (MchntImageInfoManageResponse) bizResponse.getResult();
        ConvertUtil.convertInput(mchntImageInfoManageResponse);
    }

    /**
     * 更新商户状态
     *
     * @param mchntImageInfoManageRequest 图片管理请求对象
     * @param mchntBaseInfo               商户基本信息
     * @throws Exception 异常
     */
    private void updateMchntAuditStatus(MchntImageInfoManageRequest mchntImageInfoManageRequest, MchntBaseInfo mchntBaseInfo) throws Exception {
        //正式商户新增/修改完后,审核状态是"40-修改待提交审批"；非正式新增/修改完后是"00-待提交审批"
        if (MchntStatusEnum.NORMAL.getStatus().equals(mchntBaseInfo.getMchntStatus())) {
            mchntBaseInfo.setAuditStatus(AuditStatusEnum.MODIFY_BE_COMMIT_AUDIT.getAuditStatus());
        } else if (MchntStatusEnum.UNNORMAL.getStatus().equals(mchntBaseInfo.getMchntStatus())) {
            mchntBaseInfo.setAuditStatus(AuditStatusEnum.BE_AUDIT.getAuditStatus());
        }

        /*更新正式表*/
        mchntBaseInfo.setLastOprId(mchntImageInfoManageRequest.getUserId());
        mchntBaseInfo.setLastUpdateTime(DateUtil.getCurrentDateTime(BompAppParamConstant.yyyy_MM_dd_HHmmssSSS));
        MchntBaseInfoMapper mchntBaseInfoMapper = new MchntBaseInfoMapperImpl();
        int updateResult = mchntBaseInfoMapper.updateMchntBaseInfoById(mchntBaseInfo);
        if (0 != updateResult) {
            rglog.error("更新商户基本信息正式表失败.");
            throw new BizException(RespCodeEnum.SYSTEM_BUSYNESS.getRespCode(), RespCodeEnum.SYSTEM_BUSYNESS.getRespDesc());
        }

        /*更新临时表*/
        boolean isExistBizTmp = true;//临时表数据是否存在
        BizTmpMapper bizTmpMapper = new BizTmpMapperImpl();
        BizTmp mchntBaseInfoBizTmp = bizTmpMapper.selectBizTmpByRealId(mchntBaseInfo.getInstId(), mchntBaseInfo.getId());
        MchntBaseInfo bizTmpMchntBaseInfo;
        if (null != mchntBaseInfoBizTmp) {
            bizTmpMchntBaseInfo = JSONObject.parseObject(InitParamUtil.getJsonString(mchntBaseInfoBizTmp), MchntBaseInfo.class);
            bizTmpMchntBaseInfo.setAuditStatus(mchntBaseInfo.getAuditStatus());
            bizTmpMchntBaseInfo.setLastOprId(mchntBaseInfo.getLastOprId());
            bizTmpMchntBaseInfo.setLastUpdateTime(mchntBaseInfo.getLastUpdateTime());
        } else {
            isExistBizTmp = false;
            mchntBaseInfoBizTmp = InitParamUtil.initBizTmpByCreate(mchntBaseInfo, mchntBaseInfo.getId(), JSONObject.toJSONString(mchntBaseInfo), TableNameConstant.T_B_MCHNT_BASE_INFO, mchntBaseInfo.getAuditStatus(), AppParamConstant.YES, AppParamConstant.NO);

            //没有临时表基本信息数据,将正式表基本信息放入临时表
            bizTmpMchntBaseInfo = mchntBaseInfo;
        }
        BeanUtil.beanCopy(mchntBaseInfo, mchntBaseInfoBizTmp);
        InitParamUtil.initBizTempData(mchntBaseInfoBizTmp, JSONObject.toJSONString(bizTmpMchntBaseInfo));
        int bizTmpResult;
        if (isExistBizTmp) {
            bizTmpResult = bizTmpMapper.updateBizTmpByRealId(mchntBaseInfoBizTmp);
        } else {
            bizTmpResult = bizTmpMapper.insertBizTmp(mchntBaseInfoBizTmp);
        }

        if (0 != bizTmpResult) {
            rglog.error("更新商户基本信息临时表失败.");
            throw new BizException(RespCodeEnum.SYSTEM_BUSYNESS.getRespCode(), RespCodeEnum.SYSTEM_BUSYNESS.getRespDesc());
        }
    }

    /**
     * 保存商户签约协议号
     *
     * @param mchntImageInfoManageRequest 影像管理请求对象
     * @param mchntBaseInfo               商户基本信息
     * @throws Exception 异常
     */
    private void savaMchntSignId(MchntImageInfoManageRequest mchntImageInfoManageRequest, MchntBaseInfo mchntBaseInfo) throws Exception {
        MchntSignInfoMapper mchntSignInfoMapper = new MchntSignInfoMapperImpl();
        MchntSignInfo dbMchntSignInfo = mchntSignInfoMapper.selectMchntSignInfoByPrimaryKey(mchntBaseInfo.getInstId(), mchntBaseInfo.getMchntNo());
        BizTmpMapper bizTmpMapper = new BizTmpMapperImpl();
        BizTmp signBizTmp = bizTmpMapper.selectBizTmpByRealId(dbMchntSignInfo.getInstId(), dbMchntSignInfo.getId());
        MchntSignInfo bizTmpMchntSignInfo = JSONObject.parseObject(InitParamUtil.getJsonString(signBizTmp), MchntSignInfo.class);
        bizTmpMchntSignInfo.setMchntSignId(mchntImageInfoManageRequest.getMchntSignId());
        bizTmpMchntSignInfo.setLastOprId(mchntBaseInfo.getLastOprId());
        bizTmpMchntSignInfo.setLastUpdateTime(mchntBaseInfo.getLastUpdateTime());
        InitParamUtil.initBizTempData(signBizTmp, JSONObject.toJSONString(bizTmpMchntSignInfo));
        signBizTmp.setLastOprId(mchntBaseInfo.getLastOprId());
        signBizTmp.setLastUpdateTime(mchntBaseInfo.getLastUpdateTime());
        int updateResult = bizTmpMapper.updateBizTmpByRealId(signBizTmp);
        if (0 != updateResult) {
            rglog.error("更新商户签约信息临时表失败.");
            throw new BizException(RespCodeEnum.SYSTEM_BUSYNESS.getRespCode(), RespCodeEnum.SYSTEM_BUSYNESS.getRespDesc());
        }
        if (MchntStatusEnum.UNNORMAL.getStatus().equals(mchntBaseInfo.getMchntStatus())) {
            //非正式商户时还需要更新正式表的商户签约协议号
            dbMchntSignInfo.setMchntSignId(mchntImageInfoManageRequest.getMchntSignId());
            dbMchntSignInfo.setLastOprId(mchntBaseInfo.getLastOprId());
            dbMchntSignInfo.setLastUpdateTime(mchntBaseInfo.getLastUpdateTime());
            updateResult = mchntSignInfoMapper.updateMchntSignInfoById(dbMchntSignInfo);
            if (0 != updateResult) {
                rglog.error("更新商户签约信息正式表失败.");
                throw new BizException(RespCodeEnum.SYSTEM_BUSYNESS.getRespCode(), RespCodeEnum.SYSTEM_BUSYNESS.getRespDesc());
            }
        }
    }
}
